#include "header.h"


// 这个线程来帮忙打印数据
void* printer(void* args) 
{
    int sock = *((int*) args);
    char msg[1024] = {0};

    while (true)
    {
        struct sockaddr_in temp;
        socklen_t tempLen;
        // 打印到 cerr 上, 收到的是服务器的结构体数据
        recvfrom(sock, msg, 1023, 0, (struct sockaddr*) &temp, &tempLen);
        write(2, msg, 1024);
    }
}

// 客户端
int main()
{
    // 给服务器发送消息
    // 1. 先创建套接字
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    // 2. 然后创建服务器的相关结构体
    struct sockaddr_in svr;
    svr.sin_family = AF_INET;
    svr.sin_port = htons(44444);                // 手动
    svr.sin_addr.s_addr = inet_addr("82.157.169.207");

    // 进行重定向
    int fd = open("hello.txt", O_WRONLY | O_TRUNC, 0666);
    dup2(fd, 2);

    pthread_t thd ;
    pthread_create(&thd, nullptr, printer, (void*) &sock);

    char* sendmsg = new char[1024];
    while (true)
    {
        // 向 stdin 中获取数据, 并且会自动补上 '\0'
        cout << "请输入数据：";
        fflush(stdout);
        fgets(sendmsg, 1023, stdin);
        // 持续发送数据
        sendto(sock, sendmsg, 1024, 0, (const sockaddr*) &svr, sizeof svr);
        cout << "[客户端发送数据]: " << sendmsg;
    }

    delete sendmsg;
    return 0;
}